package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.mapper.ChatGroupMapper;
import com.zenithmind.chat.pojo.dto.ChatGroupDTO;
import com.zenithmind.chat.pojo.entity.ChatGroup;
import com.zenithmind.chat.pojo.query.ChatGroupQuery;
import com.zenithmind.chat.pojo.vo.ChatGroupVO;
import com.zenithmind.chat.pojo.vo.ChatUserVO;
import com.zenithmind.common.result.PageResult;

import java.util.List;

/**
 * 聊天群组服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatGroupService extends IService<ChatGroup> {

    /**
     * 分页查询群组列表
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<ChatGroupVO> getGroupPage(ChatGroupQuery query);

    /**
     * 根据ID获取群组详情
     * 
     * @param id 群组ID
     * @param userId 当前用户ID
     * @return 群组详情
     */
    ChatGroupVO getGroupById(String id, String userId);

    /**
     * 创建群组
     * 
     * @param groupDTO 群组DTO
     * @param userId 创建者ID
     * @return 群组ID
     */
    String createGroup(ChatGroupDTO groupDTO, String userId);

    /**
     * 更新群组信息
     * 
     * @param id 群组ID
     * @param groupDTO 群组DTO
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean updateGroup(String id, ChatGroupDTO groupDTO, String userId);

    /**
     * 删除群组
     * 
     * @param id 群组ID
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean deleteGroup(String id, String userId);

    /**
     * 批量删除群组
     * 
     * @param ids 群组ID列表
     * @param userId 操作者ID
     * @return 是否成功
     */
    Boolean deleteGroupsBatch(List<String> ids, String userId);

    /**
     * 获取用户加入的群组列表
     * 
     * @param userId 用户ID
     * @param status 成员状态
     * @return 群组列表
     */
    List<ChatGroupVO> getUserGroups(String userId, Integer status);

    /**
     * 获取公开群组列表
     * 
     * @param query 查询条件
     * @return 群组列表
     */
    List<ChatGroupVO> getPublicGroups(ChatGroupQuery query);

    /**
     * 加入群组
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param inviterId 邀请人ID（可选）
     * @return 是否成功
     */
    Boolean joinGroup(String groupId, String userId, String inviterId);

    /**
     * 退出群组
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param reason 退出原因
     * @return 是否成功
     */
    Boolean leaveGroup(String groupId, String userId, String reason);

    /**
     * 邀请用户加入群组
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param inviterId 邀请人ID
     * @return 是否成功
     */
    Boolean inviteUsers(String groupId, List<String> userIds, String inviterId);

    /**
     * 移除群组成员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param operatorId 操作者ID
     * @param reason 移除原因
     * @return 是否成功
     */
    Boolean removeMembers(String groupId, List<String> userIds, String operatorId, String reason);

    /**
     * 设置群组管理员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param operatorId 操作者ID
     * @return 是否成功
     */
    Boolean setAdmins(String groupId, List<String> userIds, String operatorId);

    /**
     * 取消群组管理员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param operatorId 操作者ID
     * @return 是否成功
     */
    Boolean removeAdmins(String groupId, List<String> userIds, String operatorId);

    /**
     * 禁言群组成员
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param muteMinutes 禁言时长（分钟）
     * @param operatorId 操作者ID
     * @return 是否成功
     */
    Boolean muteMembers(String groupId, List<String> userIds, Integer muteMinutes, String operatorId);

    /**
     * 解除禁言
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param operatorId 操作者ID
     * @return 是否成功
     */
    Boolean unmuteMembers(String groupId, List<String> userIds, String operatorId);

    /**
     * 转让群主
     * 
     * @param groupId 群组ID
     * @param newOwnerId 新群主ID
     * @param currentOwnerId 当前群主ID
     * @return 是否成功
     */
    Boolean transferOwnership(String groupId, String newOwnerId, String currentOwnerId);

    /**
     * 更新群公告
     * 
     * @param groupId 群组ID
     * @param announcement 公告内容
     * @param operatorId 操作者ID
     * @return 是否成功
     */
    Boolean updateAnnouncement(String groupId, String announcement, String operatorId);

    /**
     * 获取群组成员列表
     * 
     * @param groupId 群组ID
     * @param status 成员状态
     * @param role 成员角色
     * @param keyword 搜索关键词
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 成员列表
     */
    PageResult<ChatUserVO> getGroupMembers(String groupId, Integer status, Integer role, 
                                          String keyword, Integer pageNum, Integer pageSize);

    /**
     * 根据课程创建群组
     * 
     * @param courseId 课程ID
     * @param courseName 课程名称
     * @param teacherId 教师ID
     * @return 群组ID
     */
    String createCourseGroup(String courseId, String courseName, String teacherId);

    /**
     * 根据项目创建群组
     * 
     * @param projectId 项目ID
     * @param projectName 项目名称
     * @param leaderId 项目负责人ID
     * @return 群组ID
     */
    String createProjectGroup(String projectId, String projectName, String leaderId);

    /**
     * 获取群组统计信息
     *
     * @return 统计信息
     */
    Object getGroupStatistics();

    /**
     * 检查用户权限
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param requiredRole 需要的角色（1-群主，2-管理员，3-普通成员）
     * @return 是否有权限
     */
    Boolean checkUserPermission(String groupId, String userId, Integer requiredRole);

    /**
     * 更新群组状态
     * 
     * @param id 群组ID
     * @param status 状态
     * @param operatorId 操作者ID
     * @return 是否成功
     */
    Boolean updateGroupStatus(String id, Integer status, String operatorId);
}
